#ifndef ENEMY_HH
#define ENEMY_HH
// The file shoul be named Enemmies .. before there is way more than one
#include "Character.hh"
#include "Skill.hh"
#include <string>

class Enemy : public Character {
public:
    Enemy(const std::string& name);                      // Constructor with name
    Enemy(const Enemy&) = delete;                        // Disable copy constructor
    Enemy& operator=(const Enemy&) = delete;             // Disable copy assignment
    virtual ~Enemy() = default;                          // Virtual destructor

    virtual void displayInfo() const override;           // Display info
};

class Boss : public Enemy {
public:
    Boss(const std::string& name);                       // Constructor with name
    Boss(const Boss&) = delete;
    Boss& operator=(const Boss&) = delete;
    ~Boss() override = default;

    void displayInfo() const override;
};

class EliteBoss : public Enemy {
public:
    EliteBoss(const std::string& name);
    EliteBoss(const EliteBoss&) = delete;
    EliteBoss& operator=(const EliteBoss&) = delete;
    ~EliteBoss() override = default;

    void displayInfo() const override;
};

class SuperBoss : public Enemy {
public:
    SuperBoss(const std::string& name);
    SuperBoss(const SuperBoss&) = delete;
    SuperBoss& operator=(const SuperBoss&) = delete;
    ~SuperBoss() override = default;

    void displayInfo() const override;
};

class Ghost : public Enemy {
public:
    Ghost(const std::string& name);
    Ghost(const Ghost&) = delete;
    Ghost& operator=(const Ghost&) = delete;
    ~Ghost() override = default;

    void displayInfo() const override;
};

class ArmoredWarrior : public Enemy {
public:
    ArmoredWarrior(const std::string& name);
    ArmoredWarrior(const ArmoredWarrior&) = delete;
    ArmoredWarrior& operator=(const ArmoredWarrior&) = delete;
    ~ArmoredWarrior() override = default;

    void displayInfo() const override;
};

class GoldenDevil : public Enemy {
public:
    GoldenDevil(const std::string& name);
    GoldenDevil(const GoldenDevil&) = delete;
    GoldenDevil& operator=(const GoldenDevil&) = delete;
    ~GoldenDevil() override = default;

    void displayInfo() const override;
};

class Cyborg : public Enemy {
public:
    Cyborg(const std::string& name);
    Cyborg(const Cyborg&) = delete;
    Cyborg& operator=(const Cyborg&) = delete;
    ~Cyborg() override = default;

    void displayInfo() const override;
};

class ExplosiveWarrior : public Enemy {
public:
    ExplosiveWarrior(const std::string& name);
    ExplosiveWarrior(const ExplosiveWarrior&) = delete;
    ExplosiveWarrior& operator=(const ExplosiveWarrior&) = delete;
    ~ExplosiveWarrior() override = default;

    void displayInfo() const override;
};

class SuperIdol : public Enemy {
public:
    SuperIdol(const std::string& name);
    SuperIdol(const SuperIdol&) = delete;
    SuperIdol& operator=(const SuperIdol&) = delete;
    ~SuperIdol() override = default;

    void displayInfo() const override;
};

class DemonKing : public Enemy {
public:
    DemonKing(const std::string& name);
    DemonKing(const DemonKing&) = delete;
    DemonKing& operator=(const DemonKing&) = delete;
    ~DemonKing() override = default;

    void displayInfo() const override;
};

#endif // ENEMY_HH